package pe.gob.sunarp.publicidad.repositorio;

import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.apache.log4j.Logger;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import pe.gob.sunarp.entidad.Certificado;
import pe.gob.sunarp.entidad.TaTituActo;
import pe.gob.sunarp.entidad.TpHojaPre;
import pe.gob.sunarp.entidad.TtBloqPartida;
import pe.gob.sunarp.entidad.TtPersJuriTitu;
import pe.gob.sunarp.entidad.TtPersNatuTitu;
import pe.gob.sunarp.extranet.publicidadSimple.estadoTitulo.SolicitudEstadoBean;
import pe.gob.sunarp.servicioPresentacionLinea.reservaDominio.MensajeMailBean;
import pe.gob.sunarp.servicioPresentacionLinea.reservaDominio.OficinaBean;
import pe.gob.sunarp.servicioPresentacionLinea.reservaDominio.TituloBean;

@Repository("solicitudRepositorio")
public class HibernateSolicitudRepositorio implements SolicitudRepositorio {

	private static Logger log = Logger
			.getLogger(HibernateTituloRepositorio.class.getName());

	private SessionFactory sessionFactory;

	@Autowired
	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}

	public SessionFactory getSessionFactory() {
		return sessionFactory;
	}

	private JdbcTemplate jdbcTemplate;

	@Autowired
	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}

	public JdbcTemplate getJdbcTemplate() {
		return jdbcTemplate;
	}


	@Override
	public List<OficinaBean> listOficRegistral() {
		Session session = sessionFactory.getCurrentSession();
		StringBuilder hql = new StringBuilder();		
		hql.append("SELECT NEW pe.gob.sunarp.servicioPresentacionLinea.reservaDominio.OficinaBean( ");
		hql.append("  o.id.regPubId,o.id.oficRegId, o.nombre) from OficRegistral o order by o.nombre ");
		String rhql = hql.toString();
		Query query = session.createQuery(rhql);
		List<OficinaBean> lista = query.list();
		return lista;	
	}	

	
	public List<MensajeMailBean> findMensajeMail(String anoHoja,
			String numHoja, String coOficReg, String coRegPub) {
		StringBuilder sb = new StringBuilder();

		sb.append(" SELECT REFNUM_TITU FROM MENSAJE_MAIL ");
		sb.append(" WHERE");
		sb.append(" NU_HOJA_PRES=? ");
		sb.append(" AND AA_HOJA_PRES=? ");
		sb.append(" AND REG_PUB_ID=? ");
		sb.append(" AND OFIC_REG_ID=? ");
		String sql = sb.toString();

		List<MensajeMailBean> mensajeMail = this.getJdbcTemplate().query(sql,
				new Object[] { numHoja, anoHoja, coRegPub, coOficReg },
				new RowMapper<MensajeMailBean>() {
					public MensajeMailBean mapRow(ResultSet rs, int rowNum)
							throws SQLException {
						MensajeMailBean test = new MensajeMailBean();
						test.setRefnumTitu(rs.getString("REFNUM_TITU"));
						return test;
					}
				});
		return mensajeMail;
	}

	// METHOD FOR LIST TITULO.
	public List<TituloBean> findTituloMM(long refNumTitu) {

		Session session = sessionFactory.getCurrentSession();
		StringBuilder hql = new StringBuilder();

		hql.append(" SELECT DISTINCT NEW pe.gob.sunarp.servicioPresentacionLinea.reservaDominio.TituloBean( ");
		hql.append(" t.numTitu,");
		hql.append(" t.anoTitu,");
		hql.append(" t.tsPresent)");
		hql.append(" FROM  ");
		hql.append(" Titulo t ");
		hql.append(" WHERE ");
		hql.append(" t.refnumTitu=:refNumTitu");

		String rhql = hql.toString();
		Query query = session.createQuery(rhql);
		query.setParameter("refNumTitu", refNumTitu);

		List<TituloBean> list = query.list();
		return list;
	}

	public String findProvincia(String idProv, String idDepa) {

		Session session = sessionFactory.getCurrentSession();
		StringBuilder hql = new StringBuilder();

		hql.append(" SELECT tp.nombre ||'-'||tp.tmDepartamento.nombre FROM TmProvincia tp WHERE  tp.id.dptoId=:idDepa and tp.id.provId=:idProv ");

		String rhql = hql.toString();
		Query query = session.createQuery(rhql);
		query.setParameter("idDepa", idDepa);
		query.setParameter("idProv", idProv);

		String nombre = query.uniqueResult().toString();
		return nombre;

	}

	public List<TpHojaPre> findHojaPres(String anoHoja, String numHoja,
			String coOfiPres, String coRegPub) {

		Session session = sessionFactory.getCurrentSession();
		StringBuilder hql = new StringBuilder();

		hql.append(" FROM ");
		hql.append(" TpHojaPre tp ");
		hql.append(" WHERE ");
		hql.append(" tp.id.aaHojaPres=:anoHoja ");
		hql.append(" AND tp.id.nuHojaPres=:numHoja ");
		hql.append(" AND tp.id.coRegiPres=:coRegPub ");
		hql.append(" AND tp.id.coOficRgstPres=:coOfiPres ");

		String rhql = hql.toString();
		Query query = session.createQuery(rhql);

		query.setParameter("anoHoja", anoHoja);
		query.setParameter("numHoja", numHoja);
		query.setParameter("coOfiPres", coOfiPres);
		query.setParameter("coRegPub", coRegPub);
		List<TpHojaPre> list = query.list();
		return list;

	}

	public List<TtPersJuriTitu> findDenominaionRZ(String anoHoja,
			String numHoja, String codOfic, String codReg) {
		Session session = sessionFactory.getCurrentSession();
		StringBuilder hql = new StringBuilder();

		hql.append(" FROM TtPersJuriTitu tpj ");
		hql.append(" WHERE ");
		hql.append(" tpj.tiPrtc='000' ");
		hql.append(" AND tpj.id.aaHojaPres=:anoHoja ");
		hql.append(" AND tpj.id.nuHojaPres=:numHoja  ");
		hql.append(" AND tpj.id.coOficRgstPres=:coOficReg ");
		hql.append(" AND tpj.id.coRegiPres=:codRegPub ");

		String rhql = hql.toString();
		Query query = session.createQuery(rhql);
		query.setParameter("anoHoja", anoHoja);
		query.setParameter("numHoja", numHoja);
		query.setParameter("coOficReg", codOfic);
		query.setParameter("codRegPub", codReg);

		List<TtPersJuriTitu> list = query.list();
		return list;

	}

	public List<TtPersNatuTitu> findParticipantePN(String anoHoja,
			String numHoja, String codOfic, String codReg) {
		Session session = sessionFactory.getCurrentSession();
		StringBuilder hql = new StringBuilder();

		hql.append(" FROM TtPersNatuTitu tpn ");
		hql.append(" WHERE ");
		// hql.append(" tpj.tiPrtc='000' ");
		hql.append("  tpn.id.aaHojaPres=:anoHoja ");
		hql.append(" AND tpn.id.nuHojaPres=:numHoja  ");
		hql.append(" AND tpn.id.coOficRgstPres=:coOficReg ");
		hql.append(" AND tpn.id.coRegiPres=:codRegPub ");

		String rhql = hql.toString();
		Query query = session.createQuery(rhql);
		query.setParameter("anoHoja", anoHoja);
		query.setParameter("numHoja", numHoja);
		query.setParameter("coOficReg", codOfic);
		query.setParameter("codRegPub", codReg);

		List<TtPersNatuTitu> list = query.list();
		return list;

	}

	public List<TtPersJuriTitu> findParticipantePJ(String anoHoja,
			String numHoja, String codOfic, String codReg) {
		Session session = sessionFactory.getCurrentSession();
		StringBuilder hql = new StringBuilder();

		hql.append(" FROM TtPersJuriTitu tpj ");
		hql.append(" WHERE ");
		hql.append(" tpj.tiPrtc<>'000' ");
		hql.append(" AND tpj.id.aaHojaPres=:anoHoja ");
		hql.append(" AND tpj.id.nuHojaPres=:numHoja  ");
		hql.append(" AND tpj.id.coOficRgstPres=:coOficReg ");
		hql.append(" AND tpj.id.coRegiPres=:codRegPub ");

		String rhql = hql.toString();
		Query query = session.createQuery(rhql);
		query.setParameter("anoHoja", anoHoja);
		query.setParameter("numHoja", numHoja);
		query.setParameter("coOficReg", codOfic);
		query.setParameter("codRegPub", codReg);

		List<TtPersJuriTitu> list = query.list();
		return list;

	}

	public List<TtPersJuriTitu> findAdoptante(String anoHoja, String numHoja,
			String codOfic, String codReg) {
		Session session = sessionFactory.getCurrentSession();
		StringBuilder hql = new StringBuilder();

		hql.append(" FROM TtPersJuriTitu tpj ");
		hql.append(" WHERE ");
		hql.append(" tpj.deTiPrtc='ADOPTANTE' ");
		hql.append(" AND tpj.id.aaHojaPres=:anoHoja ");
		hql.append(" AND tpj.id.nuHojaPres=:numHoja  ");
		hql.append(" AND tpj.id.coOficRgstPres=:coOficReg ");
		hql.append(" AND tpj.id.coRegiPres=:codRegPub ");

		String rhql = hql.toString();
		Query query = session.createQuery(rhql);
		query.setParameter("anoHoja", anoHoja);
		query.setParameter("numHoja", numHoja);
		query.setParameter("coOficReg", codOfic);
		query.setParameter("codRegPub", codReg);

		List<TtPersJuriTitu> list = query.list();
		return list;

	}

	public List<TaTituActo> findActoTitu(String anoHoja, String numHoja,
			String codOfic, String codReg) {
		Session session = sessionFactory.getCurrentSession();
		StringBuilder hql = new StringBuilder();

		hql.append("  FROM TaTituActo ta  ");
		hql.append(" WHERE ");
		hql.append(" ta.id.nuHojaPres=:numHoja ");
		hql.append(" AND ta.id.aaHojaPres=:anoHoja ");
		hql.append(" AND ta.id.coOficRgstPres=:coOficReg  ");
		hql.append(" AND ta.id.coRegiPres=:codRegPub ");
		// hql.append(" AND tpj.id.coRegiPres=:codRegPub ");

		String rhql = hql.toString();
		Query query = session.createQuery(rhql);
		query.setParameter("anoHoja", anoHoja);
		query.setParameter("numHoja", numHoja);
		query.setParameter("coOficReg", codOfic);
		query.setParameter("codRegPub", codReg);

		List<TaTituActo> list = query.list();
		return list;

	}

	public List<TtBloqPartida> findBloqPartida(String anoHoja, String numHoja,
			String codOfic, String codReg) {
		Session session = sessionFactory.getCurrentSession();
		StringBuilder hql = new StringBuilder();

		hql.append("  FROM TtBloqPartida tbp  ");
		hql.append(" WHERE ");
		hql.append(" tbp.id.nuHojaPres=:numHoja ");
		hql.append(" AND tbp.id.aaHojaPres=:anoHoja ");
		hql.append(" AND tbp.id.oficRegId=:coOficReg  ");
		hql.append(" AND tbp.id.regPubId=:codRegPub ");
		// hql.append(" AND tpj.id.coRegiPres=:codRegPub ");

		String rhql = hql.toString();
		Query query = session.createQuery(rhql);
		query.setParameter("anoHoja", anoHoja);
		query.setParameter("numHoja", numHoja);
		query.setParameter("coOficReg", codOfic);
		query.setParameter("codRegPub", codReg);

		List<TtBloqPartida> list = query.list();
		return list;

	}
	
//SOLICITUDES EUCLIDES
    
	@Override
	public List<SolicitudEstadoBean> buscarSolicitudes(long numeroSolicitud) {
			Session session = sessionFactory.getCurrentSession();
			StringBuilder hql = new StringBuilder();
			
			   hql.append(" SELECT NEW pe.gob.sunarp.extranet.publicidadSimple.estadoTitulo.SolicitudEstadoBean( ");
			   hql.append(" a.solicitudId, "); 
			   hql.append(" a.estado, ");   
			   hql.append(" a.total, "); 
			   hql.append(" b.mensajeRegistrador,  "); 
			   hql.append(" b.mensajeUsuario,   "); 
			   hql.append(" c.tpoPers, "); 
			   hql.append(" c.apePat, "); 
			   hql.append(" c.apeMat, "); 
			   hql.append(" c.nombres, "); 
			   hql.append(" c.razSoc, "); 
			   hql.append(" c.refnumPart, "); 
			   hql.append(" c.aaTitu, ");//string
			   hql.append(" c.numTitu, ");//string
			   hql.append(" c.numpag, ");//bigdecimal  
			   hql.append(" c.nsAsiento, ");//bigdecimal 
			   hql.append(" ac.descripcion, ");//acto string
			   hql.append(" d.certificadoId, "); 
			   hql.append(" d.codGrupoLibroArea, ");  
			   hql.append(" d.tpoCertificado, ");
			   hql.append(" d.nombre, ");
			   hql.append(" m.numPartida, ");//Partida
			   hql.append(" n.nombre, ");//Area registral			  
			   /*hql.append(" d.AREA_REG_ID as AREA_REGISTRAL_ID, ");/*private TmAreaRegistral tmAreaRegistral;*/ 
			   hql.append(" e.tpoPers, "); 
			   hql.append(" e.apePat, "); 
			   hql.append(" e.apeMat, "); 
			   hql.append(" e.nombres, "); 
			   hql.append(" e.razSoc,  "); 
			   hql.append(" e.numDocIden, "); 
			   hql.append(" f.descripcion, "); 
			   hql.append(" g.tpoEnv, "); 
			   hql.append(" g.tpoPers, "); 
			   hql.append(" g.apePat, "); 
			   hql.append(" g.apeMat, "); 
			   hql.append(" g.nombres, "); 
			   hql.append(" g.distrito, "); 
			   hql.append(" g.direcc, "); 
			   hql.append(" g.codPost, "); 
			   hql.append(" g.razSoc, "); 
			   hql.append(" h1.nombre, "); 
			   hql.append(" h2.nombre,  "); 
			   hql.append(" i.nombre, "); 
			   hql.append(" j.nombre,    "); 
			   hql.append(" k.nombre, "); 
			   hql.append(" l.tpoPago, "); 
			 //  hql.append(" l.monto, ");  
			   hql.append(" l.tsModi, "); 
			   hql.append(" l.tsCrea)");    
			   hql.append(" FROM Solicitud a LEFT join a.pagoSolicituds l, TmEstadoSolicitud b, ObjetoSolicitud c LEFT join c.tmActo ac  LEFT join c.partida m LEFT join m.tmAreaRegistral n , TmCertificado d, Solicitante e, TmDocIden f, OficRegistral h1, OficRegistral h2, Destinatario g LEFT join g.tmPai i LEFT join g.tmDepartamento j LEFT join g.tmProvincia k"); 
			   hql.append(" WHERE  "); 
			   hql.append("  b.estadoSolicitud = a.estado "); 
			        hql.append(" AND d.certificadoId  = c.tmCertificado.certificadoId  "); 
				    hql.append(" AND f.tipoDocId = e.tmDocIden.tipoDocId  "); 
					hql.append(" AND h2.id.regPubId  = c.oficRegistral.id.regPubId  "); 
					hql.append(" AND h2.id.oficRegId  = c.oficRegistral.id.oficRegId  "); 
					/*hql.append(" AND i.paisId(+) = g.paisId  "); /*LEFT destinatario -pais*/
					//hql.append(" AND j.id.dptoId(+) = g.dptoId  "); /*LEFT destinatario -pais*/
					//hql.append(" AND j.paisId(+) = g.paisId  "); /*LEFT destinatario -pais*/
					//hql.append(" AND k.paisId(+) = g.paisId  "); /*LEFT destinatario -pais*/
					//hql.append(" AND k.id.dptoId(+) = g.dptoId  "); /*LEFT destinatario -pais*/
					//hql.append(" AND k.id.provId(+) = g.provId "); /*LEFT destinatario -pais*/
					hql.append(" AND h1.id.regPubId  = g.regPubId "); /*No estan relacionadas*/ 
					hql.append(" AND h1.id.oficRegId = g.oficRegId "); /*No estan relacionadas*/ 
					//hql.append(" AND l.SOLICITUD_ID(+) = a.SOLICITUD_ID  "); /*estan relacionadas*/
					hql.append(" AND g.solicitud.solicitudId = a.solicitudId"); 
					hql.append(" AND e.solicitud.solicitudId = a.solicitudId"); 
					hql.append(" AND c.solicitud.solicitudId = a.solicitudId"); 
			      	hql.append(" AND a.solicitudId =:numSolicitud "); 
					
					String rhql = hql.toString();
					Query query = session.createQuery(rhql);
					query.setParameter("numSolicitud", numeroSolicitud);				
					List<SolicitudEstadoBean> lista = query.list();
			return lista;
	}

	@Override
	public List<Certificado> listcertificado(long solicitud_id) {
		Session session = sessionFactory.getCurrentSession();
		StringBuilder hql = new StringBuilder();
       hql.append("from Certificado  c where c.solicitudId =:numSolicitud");		
		String rhql = hql.toString();
		Query query = session.createQuery(rhql);
		query.setParameter("numSolicitud", BigDecimal.valueOf(solicitud_id));
		List<Certificado> lista = query.list();
		return lista;
	}
	//FIN DE SOLICITU EUCLIDES


}
